home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
NeXTSTEP 3.3 (Developer)…68k, x86, SPARC, PA-RISC]
/
NeXTSTEP 3.3 Dev Intel.iso
/
NextDeveloper
/
Headers
/
bsd
/
sys
/
proc.h
< prev
next >
Wrap
Text File
|
1995-02-14
|
20KB
|
577 lines
/*
* Mach Operating System
* Copyright (c) 1989 Carnegie-Mellon University
* Copyright (c) 1988 Carnegie-Mellon University
* Copyright (c) 1987 Carnegie-Mellon University
* All rights reserved. The CMU software License Agreement specifies
* the terms and conditions for use and redistribution.
*/
/*
* HISTORY
* $Log: proc.h,v $
* 07-Jan-93 Mac Gillon (mgillon) at NeXT
* Integrated POSIX changes
*
* Revision 2.10 89/10/11 14:54:00 dlb
* Pass thread to thread_should_halt().
* [88/10/18 dlb]
*
* Revision 2.9 89/03/15 15:59:42 gm0w
* Added pointer to utask to proc structure so that programs
* out-side of the kernel can find it without using the task
* structure.
* [89/03/14 gm0w]
*
* Revision 2.8 89/03/09 22:06:32 rpd
* More cleanup.
*
* Revision 2.7 89/02/27 21:04:05 mrt
* Made p_rmt_seg field in struct proc unconditional.
* [89/02/27 mrt]
*
* Revision 2.6 89/02/25 17:55:23 gm0w
* Got rid of MACH and CMUCS conditionals and all non-MACH code.
* Made CMUCS conditional code true. Make VICE conditionals
* unconditionally false for X75 binary compatibilty, should
* be changed to true.
* [89/02/13 mrt]
*
* Revision 2.5 89/01/30 22:08:17 rpd
* Updated macro definitions to the new style.
* Made variable declarations use "extern".
* [89/01/25 15:22:29 rpd]
*
* Revision 2.4 88/08/24 02:39:19 mwyoung
* Adjusted include file references.
* [88/08/17 02:20:09 mwyoung]
*
* 4-May-88 David Black (dlb) at Carnegie-Mellon University
* Document use of p_stat for MACH.
*
* 29-Mar-88 Michael Young (mwyoung) at Carnegie-Mellon University
* MACH: Removed unused variables (whichqs).
*
* 11-Apr-88 Mike Accetta (mja) at Carnegie-Mellon University
* Move controlling terminal information to proc structure from
* U-area (to provide better handle on disconnecting background
* processes from a terminal); CS_SECURITY => CMUCS.
* [ V5.1(XF23) ]
*
* 29-Dec-87 David Golub (dbg) at Carnegie-Mellon University
* Delinted.
*
* 26-Dec-87 David Golub (dbg) at Carnegie-Mellon University
* Removed MACH_NOFLOAT.
*
* 21-Dec-87 David Golub (dbg) at Carnegie-Mellon University
* Check for thread termination condition and return properly
* in more places in sig_lock.
*
* 9-Dec-87 David Golub (dbg) at Carnegie-Mellon University
* Changed forced_exit case of sig_lock to call thread_halt_self
* for new thread termination logic.
*
* 3-Dec-87 David Black (dlb) at Carnegie-Mellon University
* Added second argument to task_dowait.
*
* 18-Nov-87 Avadis Tevanian (avie) at Carnegie-Mellon University
* Eliminated MACH conditionals.
*
* 28-Oct-87 David Golub (dbg) at Carnegie-Mellon University
* MACH_TT: restore definition of SWEXIT to keep ps happy.
*
* 16-Oct-87 David Black (dlb) at Carnegie-Mellon University
* MACH_TT: Incorporate exit_thread logic in sig_lock() macro.
* This replaces and extends core_thread.
*
* 25-Sep-87 David Black (dlb) at Carnegie-Mellon University
* MACH: added core_thread field to deal with network core dumps.
*
* 18-Sep-87 Richard Sanzi (sanzi) at Carnegie-Mellon University
* Deleted definition of SOWEFPA, as this condition is no longer
* associated with processes, but rather with threads.
*
* 4-Sep-87 David Black (dlb) at Carnegie-Mellon University
* Added sig lock for signals and exit. This frees proc lock for
* other uses.
*
* 15-May-87 David Black (dlb) at Carnegie-Mellon University
* MACH: Added p_stopsig field to record signal that stopped
* process. Can't use p_cursig for this purpose under MACH.
*
* 30-Mar-87 Avadis Tevanian (avie) at Carnegie-Mellon University
* Added a lock to the proc structure to synchronize Unix things in
* a multiple thread environement. This is not conditional on
* MACH (but on MACH) so that the same version of ps and friends
* will work on both kernels.
*
* 06-Mar-87 Mike Accetta (mja) at Carnegie-Mellon University
* Changed to use shorts instead of ints for these values that
* are really signed chars anyway since its more space efficient
* and consistent with the prior fix to p_nice.
* [ V5.1(F5) ]
*
* 05-Mar-87 Avadis Tevanian (avie) at Carnegie-Mellon University
* Make usrpri, pri and nice ints for ROMP due to compiler
* difference (this doesn't matter under MACH, but till we run
* that everywhere...)
*
* 04-Mar-87 Jonathan J. Chew (jjc) at Carnegie-Mellon University
* Added pointer to proc structure of tracer for Sun.
*
* 02-Mar-87 Mike Accetta (mja) at Carnegie-Mellon University
* Fixed to make the p_nice field a short on the IBM-RT since its
* current compiler doesn't provide signed char types and this is
* wreaking havoc with high priority processes never getting any
* cycles! This fix is only temporary until a better compiler
* becomes the standard.
* [ V5.1(F4) ]
*
* 7-Feb-87 Avadis Tevanian (avie) at Carnegie-Mellon University
* Merge VICE changes -- include vice.h and change to #if VICE.
*
* 31-Jan-87 Avadis Tevanian (avie) at Carnegie-Mellon University
* Eliminate p_wchan for MACH as a check for elimination of all
* uses of it.
*
* 08-Jan-87 Robert Beck (beck) at Sequent Computer Systems, Inc.
* If MACH, declare p_pctcpu as a long and define PCTCPU_SCALE.
*
* 31-Dec-86 David Golub (dbg) at Carnegie-Mellon University
* Purged all MACH uses of p0br and friends. Removed fields
* that refer to text structure, and removed segment size fields
* (p_tsize, p_dsize, p_ssize) that are unused under MACH.
* ROMP_FPA should be the next to go (it belongs with the thread info).
*
* 2-Dec-86 Jay Kistler (jjk) at Carnegie-Mellon University
* VICE: 1/ added p_rmt_seq field to "proc" struct;
* 2/ added SRMT flag;
*
* 31-Oct-86 Avadis Tevanian (avie) at Carnegie-Mellon University
* Removed include of task/thread header files by using "struct"
* instead of typedef.
*
* 15-Oct-86 Avadis Tevanian (avie) at Carnegie-Mellon University
* Well, as it turns out, the Multimax code actually does want the
* Vax versions of p0br and friends for compatibility. Presumably
* these will all go away someday anyway.
*
* 14-Oct-86 William Bolosky (bolosky) at Carnegie-Mellon University
* Changed #ifdef romp #else romp {vax code here} #endif romp to
* the (correct) #ifdef vax {vax code here} #endif vax. This
* should NOT be changed back again; we now have more machines than
* just the vax and the RT, and I don't think that the Sun and the
* Encore want definitions of p_p0br. It's time to fix the scripts.
*
* 30-Sep-86 Avadis Tevanian (avie) at Carnegie-Mellon University
* Added backpointers from proc to task and thread.
*
* 24-Sep-86 Michael Young (mwyoung) at Carnegie-Mellon University
* Added include of <sys/types.h> to pick up uid_t, etc.
*
* 6-Sep-86 Michael Young (mwyoung) at Carnegie-Mellon University
* Added include of <sys/time.h> for non-KERNEL compiles.
*
* 20-Jul-86 Michael Young (mwyoung) at Carnegie-Mellon University
* Added include of "time.h" to satisfy "struct itimerval"
* reference.
*
* 7-Jul-86 Bill Bolosky (bolosky) at Carnegie-Mellon University
* romp: removed p_sid0 and p_sid1 (since this info is stored in
* the pmap and is no longer used). Conditionalized
* SPTECHG on vax and added SOWEFPA in same bit on romp w/FPA.
* Conditionalized p0br and p1br on vax.
*
* 25-Jan-86 Avadis Tevanian (avie) at Carnegie-Mellon University
* Upgraded to 4.3.
*
* 18-Feb-86 Bill Bolosky (bolosky) at Carnegie-Mellon University
* Added definition of p_sid0 and p_sid1 in proc structure for
* IBM-RT under switch romp.
*
* 3-Sep-85 Avadis Tevanian (avie) at Carnegie-Mellon University
* MACH: Added SACTIVE flag to signify that a process is actually
* running on a cpu.
*
* 25-Aug-85 Avadis Tevanian (avie) at Carnegie-Mellon University
* Allow recursive includes.
*
* 25-May-85 Mike Accetta (mja) at Carnegie-Mellon University
* Upgraded from 4.1BSD. Carried over changes below.
* [V1(1)]
*
* 20-Aug-81 Mike Accetta (mja) at Carnegie-Mellon University
* CMUCS: added SXONLY bit definition to flag execute only
* processes;
*
*/
/*
* Copyright (c) 1982, 1986 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*
* @(#)proc.h 7.1 (Berkeley) 6/4/86
*/
#ifndef _SYS_PROC_H_
#define _SYS_PROC_H_
#import <mach/boolean.h>
#import <sys/time.h>
#import <sys/types.h>
#import <sys/user.h>
#import <kernserv/lock.h>
#import <mach/machine/vm_types.h>
#if POSIX_KERN
#import <mach/machine/vm_types.h>
/*
* One structure allocated per session.
*/
struct session {
int s_count; /* ref cnt; pgrps in session */
struct proc *s_leader; /* session leader */
struct tty *s_ttyp; /* controlling terminal */
dev_t s_ttyd; /* controlling tty dev */
};
/*
* One structure allocated per process group.
*/
struct pgrp {
struct pgrp *pg_hforw; /* forward link in hash bucket */
struct proc *pg_mem; /* pointer to pgrp members */
struct session *pg_session; /* pointer to session */
pid_t pg_id; /* pgrp id */
int pg_jobc; /* # procs qualifying pgrp for job control */
};
extern struct pgrp *pgrphash[];
extern struct pgrp *pgfind();
#ifdef KERNEL
#define SESS_LEADER(p, px) ((px)->p_session->s_leader == (p))
#endif /* KERNEL */
struct posix_proc {
pid_t p_pid; /* for identification */
uid_t p_ruid; /* real user id needed for kill() */
uid_t p_svuid; /* saved set-user-id needed for kill() */
gid_t p_svgid; /* saved set-group-id needed for kill() */
struct proc *p_pgrpnxt; /* pointer to next process in process group */
struct pgrp *p_posix_pgrp; /* pointer to process group */
#define p_pgid p_posix_pgrp->pg_id
#define p_session p_posix_pgrp->pg_session
struct lockf *p_lockf_chan; /* Process sleeping on a struct lockf */
/* waiting on an fcntl() file lock. */
int p_posix_utime : 1;
int p_posix_noctty : 1;
int p_posix_reserved : 30;
struct posix_proc *p_next_posix_proc;
};
extern struct posix_proc *posix_proc_hash[];
extern struct posix_proc *get_posix_proc();
extern struct posix_proc *new_posix_proc();
extern void delete_posix_proc();
#endif /* POSIX_KERN */
/*
* One structure allocated per active
* process. It contains all data needed
* about the process while the
* process may be swapped out.
* Other per process data (user.h)
* is swapped with the process.
*/
struct proc {
struct proc *p_link; /* linked list of running processes */
struct proc *p_rlink;
struct proc *p_nxt; /* linked list of allocated proc slots */
struct proc **p_prev; /* also zombies, and free proc's */
#ifdef ibmrt
short p_usrpri; /* user-priority based on p_cpu and p_nice */
short p_pri; /* priority, negative is high */
short p_cpu; /* cpu usage for scheduling */
#else ibmrt
char p_usrpri; /* user-priority based on p_cpu and p_nice */
char p_pri; /* priority, negative is high */
char p_cpu; /* cpu usage for scheduling */
#endif ibmrt
char p_stat;
char p_time; /* resident time for scheduling */
#ifdef ibmrt
short p_nice; /* nice for cpu usage */
#else ibmrt
char p_nice; /* nice for cpu usage */
#endif ibmrt
#if NeXT
char p_debugger : 1; /* 1: can exec set-bit programs if */
/* suser */
char p_posix : 1;
char p_reserved : 6;
#else NeXT
char p_slptime; /* time since last block */
#endif NeXT
char p_cursig;
int p_sig; /* signals pending to this process */
int p_sigmask; /* current signal mask */
int p_sigignore; /* signals being ignored */
int p_sigcatch; /* signals being caught by user */
int p_flag;
uid_t p_uid; /* user id, used to direct tty signals */
short p_pgrp; /* name of process group leader */
short p_pid; /* unique process id */
short p_ppid; /* process id of parent */
u_short p_xstat; /* Exit status for wait */
struct rusage *p_ru; /* mbuf holding exit information */
#if NeXT
/* These fields are not used. */
#else NeXT
size_t p_rssize; /* current resident set size in clicks */
size_t p_maxrss; /* copy of u.u_limit[MAXRSS] */
size_t p_swrss; /* resident set size before last swap */
swblk_t p_swaddr; /* disk address of u area when swapped */
#endif NeXT
int p_stopsig; /* signal that stopped us. */
#if NeXT
/* Other elements unused */
struct proc *p_hash; /* hash table link */
#else NeXT
int p_stopsig; /* signal that stopped us. */
short p_cpticks; /* ticks of cpu time */
long p_pctcpu; /* %cpu for this process during p_time */
short p_ndx; /* proc index for memall (because of vfork) */
short p_idhash; /* hashed based on p_pid for kill+exit+... */
#endif NeXT
struct proc *p_pptr; /* pointer to process structure of parent */
struct proc *p_cptr; /* pointer to youngest living child */
struct proc *p_osptr; /* pointer to older sibling processes */
struct proc *p_ysptr; /* pointer to younger siblings */
struct itimerval p_realtimer;
struct quota *p_quota; /* quotas for this process */
#if NeXT
/* These fields are not used. */
#else NeXT
dev_t p_logdev; /* logged-in controlling device */
dev_t p_ttyd; /* controlling tty dev */
struct tty *p_ttyp; /* controlling tty pointer */
#endif NeXT
struct task *task; /* corresponding task */
#if NeXT
/* utask was only initialized (in kern_fork.c), don't need it. */
#else NeXT
struct utask *utask; /* utask structure of corresponding task */
#endif NeXT
struct thread *thread;/* corresponding thread */
#if NeXT
/* not used. */
#else NeXT
int p_rmt_seq; /* This process is waiting for a remote file
system reply message containing this
sequence number - VICE only */
#endif NeXT
simple_lock_data_t siglock; /* multiple thread signal lock */
boolean_t sigwait; /* indication to suspend */
struct thread *exit_thread; /* XXX Which thread is exiting?
XXX That thread does no signal
XXX processing, other threads
XXX must suspend. */
#if NeXT
struct proc *p_tptr; /* pointer to process structure of tracer */
struct proc *p_aptr; /* pointer to process attached to debugger */
#endif NeXT
#ifdef sun
struct proc *p_tptr; /* pointer to process structure of tracer */
#endif sun
#if NeXT
vm_offset_t user_stack; /* where user stack was allocated */
#endif NeXT
};
#ifdef KERNEL
#import <kernserv/macro_help.h>
/*
* Signal lock has the following states and corresponding actions
* that the locker must take:
*
* Locked (siglock) - simple lock acquires the lock when free.
* Unlocked (sigwait = 0 && exit_thread == 0) simple lock.
* Waiting (sigwait != 0) - Drop siglock after acquiring it, and
* call thread_block(). Thread that set the lock to
* wait has done a task_suspend().
* Exiting (exit_thread != 0) - The thread in exit_thread is going to
* call exit(). If we're not that thread, permanently stop
* in favor of that thread. If we're that thread, immediately
* bail out (no signal processing is permitted once we're
* committed to exit) and indicate that signals should not be
* processed. If we have been asked to halt, bail out and
* indicate that signals should be processed (to clean up any
* saved state).
*
* The logic for this is in the sig_lock_or_return macro.
*/
/*
* Try to grab signal lock. If we are already exiting,
* execute 'false_return'. If some other thread is exiting,
* hold. If we must halt, execute 'true_return'.
*/
#define sig_lock_or_return(p, false_return, true_return) \
MACRO_BEGIN \
simple_lock(&(p)->siglock); \
while ((p)->sigwait || (p)->exit_thread) { \
simple_unlock(&(p)->siglock); \
if ((p)->exit_thread) { \
if (current_thread() == (p)->exit_thread) { \
/* \
* Already exiting - no signals. \
*/ \
false_return; \
} \
else { \
/* \
* Another thread has called exit - \
* stop (until terminate request). \
*/ \
thread_hold(current_thread()); \
} \
} \
thread_block(); \
if (thread_should_halt(current_thread())) { \
/* \
* Terminate request - clean up. \
*/ \
true_return; \
} \
simple_lock(&(p)->siglock); \
} \
MACRO_END
/*
* Try to grab signal lock. Return from caller if
* we must halt or task is exiting.
*/
#define sig_lock(p) sig_lock_or_return(p, return, return)
#define sig_lock_simple(p) simple_lock(&(p)->siglock)
#define sig_unlock(p) simple_unlock(&(p)->siglock)
#define sig_lock_to_wait(p) \
MACRO_BEGIN \
(p)->sigwait = TRUE; \
simple_unlock(&(p)->siglock); \
MACRO_END
#define sig_wait_to_lock(p) \
MACRO_BEGIN \
simple_lock(&(p)->siglock); \
(p)->sigwait = FALSE; \
MACRO_END
/*
* sig_lock_to_exit() also shuts down all other threads except the
* current one. There is no sig_exit_to_lock(). The sig_lock is
* left in exit state and is cleaned up by exit().
*/
#define sig_lock_to_exit(p) \
MACRO_BEGIN \
(p)->exit_thread = current_thread(); \
simple_unlock(&(p)->siglock); \
(void) task_hold(current_task()); \
(void) task_dowait(current_task(), FALSE); \
MACRO_END
#endif KERNEL
#define PIDHSZ 64
#define PIDHASH(pid) ((pid) & (PIDHSZ - 1))
#ifdef KERNEL
#if NeXT
extern struct proc *pidhash[PIDHSZ];
extern struct proc *pfind();
extern struct proc *freeproc, *zombproc, *allproc;
/* lists of procs in various states */
extern int max_proc; /* Max number of procs */
extern struct proc *kernel_proc, *init_proc;
struct proc *getproc();
#else NeXT
extern short pidhash[PIDHSZ];
extern struct proc *pfind();
extern struct proc *proc, *procNPROC; /* the proc table itself */
extern struct proc *freeproc, *zombproc, *allproc;
/* lists of procs in various states */
extern int nproc;
#endif NeXT
#define NQS 32 /* 32 run queues */
extern struct prochd {
struct proc *ph_link; /* linked list of running processes */
struct proc *ph_rlink;
} qs[NQS];
#define PCTCPU_SCALE 1000 /* scaling for p_pctcpu */
#endif KERNEL
/* stat codes */
/*
* MACH uses only NULL, SRUN, SZOMB, and SSTOP.
*/
#define SSLEEP 1 /* awaiting an event */
#define SWAIT 2 /* (abandoned state) */
#define SRUN 3 /* running */
#define SIDL 4 /* intermediate state in process creation */
#define SZOMB 5 /* intermediate state in process termination */
#define SSTOP 6 /* process being traced */
/* flag codes */
#define SLOAD 0x00000001 /* in core */
#define SSYS 0x00000002 /* swapper or pager process */
#define SLOCK 0x00000004 /* process being swapped out */
#define SSWAP 0x00000008 /* save area flag */
#define STRC 0x00000010 /* process is being traced */
#define SWTED 0x00000020 /* another tracing flag */
#define SULOCK 0x00000040 /* user settable lock in core */
#define SPAGE 0x00000080 /* process in page wait state */
#define SKEEP 0x00000100 /* another flag to prevent swap out */
#define SOMASK 0x00000200 /* restore old mask after taking signal */
#define SWEXIT 0x00000400 /* working on exiting */
#define SPHYSIO 0x00000800 /* doing physical i/o (bio.c) */
#define SVFORK 0x00001000 /* process resulted from vfork() */
#define SVFDONE 0x00002000 /* another vfork flag */
#define SNOVM 0x00004000 /* no vm, parent in a vfork() */
#define SPAGI 0x00008000 /* init data space on demand, from inode */
#define SSEQL 0x00010000 /* user warned of sequential vm behavior */
#define SUANOM 0x00020000 /* user warned of random vm behavior */
#define STIMO 0x00040000 /* timing out during sleep */
/* was SDETACH */
#define SACTIVE 0x00080000 /* process is executing */
#define SOUSIG 0x00100000 /* using old signal mechanism */
#define SOWEUPC 0x00200000 /* owe process an addupc() call at next ast */
#define SSEL 0x00400000 /* selecting; wakeup/waiting danger */
#define SLOGIN 0x00800000 /* a login process (legit child of init) */
#define SXONLY 0x02000000 /* process image read protected */
#define SIDLE 0x04000000 /* is an idle process */
#define SRMT 0x10000000 /* VICE remote file system access--don't stop job */
#if POSIX_KERN
#define SCTTY 0x40000000 /* has a controlling terminal */
#define SEXEC 0x80000000 /* process called exec */
#endif /* POSIX_KERN */
#if NeXT
#define SLKDONE 0x20000000 /* record-locking has been done */
#endif NeXT
#endif _SYS_PROC_H_